package com.singleton.pattern.singleton.demo;

/**
 * @Classname LazySingleton
 * @Description 双重检查锁单例
 * @Date 2019/11/20 0020 15:30
 * @Created by 埔枘
 */
public class LazyDoubleCheckSingleton {

    private LazyDoubleCheckSingleton(){}

    /**
     *  volatile 禁止重排序
     */
    public static volatile LazyDoubleCheckSingleton lazySingleton = null;

    /**
     *  外部调用时 才会加载
     * @return
     */
    public static LazyDoubleCheckSingleton getSingleton(){
        if(lazySingleton == null){
            // D
            synchronized (LazyDoubleCheckSingleton.class){
                // 二次判断 防止线程 A,B 都在 D 位置 时 线程A 先拿到锁并创建了对象，然后线程B拿到锁 不做判断的话 会创建出多个实例
                if(lazySingleton == null){
                    lazySingleton = new LazyDoubleCheckSingleton();
                }
            }
        }
        return lazySingleton;
    }
}
